Jag har skrivit en funktion för att förhindra att ringa Bitmap.createBitmap () om det kommer att kasta en OutOfMemoryError: bitmappsstorleken överstiger VM-budgeten, men jag fungerar inte alltid, hur rättar jag det? Här är ett exempel där det returnerar true istället för false: if (isSufficientRAM (bredd * höjd)) { Bitmap bmp = Bitmap.createBitmap (bredd, höjd, Bitmap.Config.ARGB_8888); ... } offentlig statisk boolesk isSufficientRAM (int längd) { int minRamAfter = 1024 * 1024; // 1048576 byte (lämna alltid minst 1 MB ledigt) lång imgSize = längd * 4; // det här är 31961088 byte i det här fallet, eftersom det är en 3264 x 2448 argb-bild lång freeRAM = Runtime.getRuntime (). freeMemory (); // det här var 34415992 byte när jag kör det boolean hasRAM = freeRAM> imgSize + minRamAfter; // detta är sant eftersom freeMemory () visar tillräckligt med RAM-minne tillgängligt retur hasRAM; } När jag kör det här kommer funktionen att återgå till sant och Bitmap.createBitmap () ger felet nedan. Vad saknar jag i min isSufficientRAM () -funktion? 11-15 09: 01: 47.965: minRamAfter = 1048576 11-15 09: 01: 47.965: imgSize = 31961088 11-15 09: 01: 47.970: freeRAM = 34415992 11-15 09: 01: 48.020: hasRAM = true 11-15 09: 01: 48.060: D / dalvikvm (2538): GC_EXTERNAL_ALLOC frigjord 79K, 92% fri 3850K / 44679K, extern 2343K / 3018K, pausad 37ms 11-15 09: 01: 48.080: E / dalvikvm-heap (2538): 31961088-byte extern tilldelning för stor för denna process. 11-15 09: 01: 48.115: E / GraphicsJNI (2538): VM låter oss inte tilldela 31961088 byte 11-15 09: 01: 48.115: D / dalvikvm (2538): GC_FOR_MALLOC frigjord 0K, 92% ledig 3850K / 44679K, extern 2343K / 3018K, pausad 22ms 11-15 09: 01: 48.115: W / dalvikvm (2538): threadid = 12: tråd går ut med undantaget undantag (grupp = 0x4001e578) 11-15 09: 01: 48.115: E / AndroidRuntime (2538): FATAL EXCEPTION: Test thread name 11-15 09: 01: 48.115: E / AndroidRuntime (2538): java.lang.OutOfMemoryError: bitmappsstorlek överstiger VM-budget 11-15 09: 01: 48.115: E / AndroidRuntime (2538): vid android.graphics.Bitmap.nativeCreate (Native Method) 11-15 09: 01: 48.115: E / AndroidRuntime (2538): på android.graphics.Bitmap.createBitmap (Bitmap.java:477)
2020-12-21 09:57:38
".discard-answer" , direktShowMarkdownHelp: true, enableTables: true, enableSnippets: true }); } }); Tack för att du bidrog med ett svar till Stack Overflow! Var noga med att svara på frågan. Ge detaljer och dela din forskning! Men undvik ... Be om hjälp, förtydligande eller svara på andra svar. Att göra uttalanden baserade på åsikt; säkerhetskopiera dem med referenser eller personlig erfarenhet. För att lära dig mer, se våra tips för att skriva bra svar. Utkast sparat Utkast kasseras Registrera dig eller logga in StackExchange.ready (funktion () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Registrera dig med Google Registrera dig med Facebook Registrera dig med e-post och lösenord Skicka in Lägg upp som gäst namn E-post Obligatoriskt men aldrig visat StackExchange.ready ( funktion () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f13393264% 2fgetruntime-freememory-available-but-still-vm-wont-let-us-allocate- 31961088% 23nytt svar ',' fråga_sida '); } ); Lägg upp som gäst namn E-post Obligatoriskt men aldrig visat Lägg upp ditt svar Kassera Genom att klicka på “Lägg upp ditt svar” godkänner du våra användarvillkor, sekretesspolicy och cookiepolicy Bläddra bland andra frågor taggade Android-minne eller ställ din egen fråga.